注入类:SQL 与命令注入(前后端协作视角)
本质防线在后端:参数化查询 / ORM 绑定 / 禁止拼接 Shell。前端仍需避免把用户输入 拼进发往服务器的查询语句模板(误导后端或绕过网关),并拒绝 把模板字符串当 SQL 使用。
SQL 注入示意(错误)
前端 仅为示意:绝不应对生产库执行。
js
const username = document.getElementById('u').value;
const sql = `SELECT * FROM users WHERE name='${username}'`;
// username = admin' OR '1'='1' --即使请求发到后端,若后端再次拼接,仍会注入。
正确请求形态(参数交给服务端)
js
await fetch('/api/users/lookup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: document.getElementById('u').value }),
});由服务端使用 预编译语句:
sql
SELECT * FROM users WHERE name = ?命令注入(上传文件名 / 系统调用)
若后端误把文件名拼进 Shell:
text
filename = "; rm -rf /"前端可做 输入校验与文件名规范化(去掉路径分隔符),但 最终必须由服务端 白名单存储与安全调用。
小结
前端:JSON 传参、不做 SQL 拼接演示进生产;后端:参数化 + 最小权限账户。前端校验只为体验,不可替代服务端校验。
